/**
 * 将数字转换为千分位的字符串，必须传入数字
 * 如果是字符串方法 toLocaleString 不会生效
 * 在方法内部使用数据类型转换后更安全
 * @param v 传入数值
 * @returns {string}
 */
function permilNumber(v){
  return Number(v).toLocaleString()
}

/**
 * 使用正则表达式的方式显示千分位
 * 这里有3中数值转换为字符串的方法 - 字符串可以使用正则表达式，数值不可以
 * 1. 使用模板字符串的方法：`${v}`
 * 2. 拼接空字符串：''+ v
 * 3. 使用String类：String(v)
 * 效果示例：传入1234567890，返回：1,234,567,890 - 即实现千分位
 * @param v 传入数值或者字符串都可以
 */
function regFormatPermil(v){
  /**
   * 解释下面正则表达式
   * 第一个字符 /以及后面倒数第二个字符/中间是正则表达式
   * 最后的字符g表示全局匹配，在整个字符串中查找
   * + 表示匹配一次或者多次前面的规则
   * $ 表示字符串的结束
   * (?=(\d{3})+$) 是正则表达式中的一个规则：正向肯定预查
   * 前面的 \d{1,3} 表示1个数字构成的字符串、2个数字个数字构成的字符串、3个数字构成的字符串
   * 都符合条件
   * 正向肯定预查中的 \d{3} 表示必须是3个数字构成的一个字符串
   * return 行的 $& 表示在匹配到的字符串后面追加符号 ,
   * 当传入 1234567890 时候，按照该正则表达式的规则获取到的一系列字符串是：
   * 1
   * 234
   * 567
   * 最后的890不会匹配到，因为他们后面没有连续的3个数字构成的字符串了
   * 即在1、234、567 三个字符串的后面都追加 ,
   * 即达到了显示千分位的效果
   * 第一个 \d 表示取字符串中的数字
   */
  const reg = /\d{1,3}(?=(\d{3})+$)/g
  return `${v}`.replace(reg,'$&,')
}
/**
 * 包装数据
 * @param o 数据所属对象
 * @param k 数据属性名称（字段名称）
 */
function wrapperNumber(o,k){
  // return o && o[k] ? permilNumber(o[k]):0
  return o && o[k] ? regFormatPermil(o[k]):0
}

// 用于组件通信的 mixin
export default {
  // 将全局透传属性集中管理后方法的名称使用前缀cdm
  // 表示 commonDataMixin
  computed: {
    cdmWordCloud() {
      return this.attWordCloud()
    },

    // 后端返回来的是 JsonResult 包装好的数据
    // 那么如果要显示到前端需要：cdmReportData.data[0].salesToday
    // data 是个数组，和它平级的还有code、msg
    cdmReportData() {
      return this.attReportData()
    },
    cdmSalesToday() {
      //return this.cdmReportData && this.cdmReportData.data[0].salesToday
      return wrapperNumber(this.cdmReportData && this.cdmReportData.data[0],'salesToday')
    },
    cdmSalesGrowthLastDay(){
      //return this.cdmReportData && this.cdmReportData.data[0].salesGrowthLastDay
      return wrapperNumber(this.cdmReportData && this.cdmReportData.data[0],'salesGrowthLastDay')
    },
    cdmSalesGrowthLastMonth(){
      //return this.cdmReportData && this.cdmReportData.data[0].salesGrowthLastMonth
      return wrapperNumber(this.cdmReportData && this.cdmReportData.data[0],'salesGrowthLastMonth')
    },
    cdmSalesLastDay(){
      //return this.cdmReportData && this.cdmReportData.data[0].salesLastDay
      return wrapperNumber(this.cdmReportData && this.cdmReportData.data[0],'salesLastDay')
    },
    cdmSalesLastMonth(){
      //return this.cdmReportData && this.cdmReportData.data[0].salesLastMonth
      return wrapperNumber(this.cdmReportData && this.cdmReportData.data[0],'salesLastMonth')
    },

    cdmMapData() {
      return this.attMapData()
    },

  },
  inject: ['attWordCloud','attReportData','attMapData']
}
